package com.jasperframework.boot.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;


/**
 * <p> ffmpeg工具类  </p>
 *
 * @site https://miliqkdoc.motopa.cn/
 * @author daizhao
 * @date 2022/12/12 12:12
 */
public class FFmpegUtils {

	private static final Logger logger = LoggerFactory.getLogger(FFmpegUtils.class);

	private static final int[] op_num = {0, 1, 9};

	public static int convertXMedia(String srcVideoPath, String outVideoPath, String RUNNING_SHELL_DIR){
		List<String> commands = new ArrayList<String>();
		commands.add("ffmpeg");
		commands.add("-i");
		commands.add(srcVideoPath);//原视频
		commands.add("-vcodec");
		commands.add("libx264");
		commands.add("-profile:v");
		commands.add("baseline");
		commands.add("-preset:v");
		commands.add("faster");//快速压缩
		commands.add("-level");
		commands.add("3.0");
		commands.add("-vf");
		commands.add("scale=720:trunc(ow/a/2)*2");//等比例压缩、width：720是固定的的，height：按比例压缩
		commands.add(outVideoPath);//输出视频
		return ProcessBuilderUtils.runLinuxCommand(commands, RUNNING_SHELL_DIR);
	}

	/**
	 * 视频截屏
	 * @param srcVideoPath  源文件
	 * @param outImagePath  输出文件
	 * @param RUNNING_SHELL_DIR  shell命令执行所在目录
	 */
	public static int videoSnapshotsGenius(String srcVideoPath, String outImagePath, String RUNNING_SHELL_DIR){
		List<String> commands = new ArrayList<String>();
		commands.add("ffmpeg");
		commands.add("-i");
		commands.add(srcVideoPath);//原视频
		commands.add("-y");  //如果存在文件覆盖此文件
		commands.add("-ss");//表示开始时间
		commands.add("00:00:02");
		commands.add("-t");//表示共要多少时间
		commands.add("1");
		commands.add("-r");
		commands.add("1");
		commands.add("-q:v");
		commands.add("2");
		commands.add("-f");
		commands.add("image2");
        //commands.add("screenshot%03d.jpg");//截图文件，自定义的，目前是当前目录的，动态生成多个截图“%03d”会根据时间自动生成001、002、003这种方式对应时间进度
        //commands.add(new Date() + ".jpg");//截图文件，自定义的，目前是当前目录的
		commands.add(outImagePath);//截图文件，自定义的，目前是当前目录的
		return ProcessBuilderUtils.runLinuxCommand(commands, RUNNING_SHELL_DIR);
	}

	/**
	 * 是否允许视频转换    规则：不是MP4的文件才允许转换视频
	 * @param path
	 * @return
	 */
	public static Integer isXMediaRecode(String path) {
		logger.info("isXMediaRecode：{}————>" + path);
		String type = path.substring(path.lastIndexOf(".") + 1).toLowerCase();
		// ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等）
		if (type.equals("avi")) {
			return op_num[1];
		} else if (type.equals("mpg")) {
			return op_num[1];
		} else if (type.equals("wmv")) {
			return op_num[1];
		} else if (type.equals("3gp")) {
			return op_num[1];
		} else if (type.equals("mov")) {
			return op_num[1];
		} else if (type.equals("mp4")) {// 本身是MP4格式不用转换
			return op_num[1];
		} else if (type.equals("asf")) {
			return op_num[1];
		} else if (type.equals("asx")) {
			return op_num[1];
		} else if (type.equals("flv")) {
			return op_num[1];
		}
		// 对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等),
		else if (type.equals("wmv9")) {
			return op_num[0];
		} else if (type.equals("rm")) {
			return op_num[0];
		} else if (type.equals("rmvb")) {
			return op_num[0];
		}
		return op_num[0];
	}

}
